.. role:: raw-html-m2r(raw)
:format: html
.. _Int:
Unit/SInt
=========
Description
^^^^^^^^^^^
The ``UInt``/``SInt`` type corresponds to a vector of bits that can be used for signed/unsigned integer arithmetic.
Declaration
^^^^^^^^^^^
The syntax to declare an integer is as follows: (everything between [] is optional)
.. list-table::
:header-rows: 1
:widths: 2 5 1
* - Syntax
- Description
- Return
* - | UInt[()]
| SInt[()]
- Create an unsigned/signed integer, bits count is inferred
- | UInt
| SInt
* - | UInt(x bits)
| SInt(x bits)
- Create an unsigned/signed integer with x bits
- | UInt
| SInt
* - | U(value: Int[,x bits])
| S(value: Int[,x bits])
- Create an unsigned/signed integer assigned with 'value'
- | UInt
| SInt
* - | U"[[size']base]value"
| S"[[size']base]value"
- Create an unsigned/signed integer assigned with 'value' (Base : 'h', 'd', 'o', 'b')
- | UInt
| SInt
* - | U([x bits,] :ref:`element `, ...)
| S([x bits,] :ref:`element `, ...)
- Create an unsigned integer assigned with the value specified by elements
- | UInt
| SInt
.. code-block:: scala
val myUInt = UInt(8 bits)
myUInt := U(2,8 bits)
myUInt := U(2)
myUInt := U"0000_0101" // Base per default is binary => 5
myUInt := U"h1A" // Base could be x (base 16)
// h (base 16)
// d (base 10)
// o (base 8)
// b (base 2)
myUInt := U"8'h1A"
myUInt := 2 // You can use scala Int as literal value
val myBool := myUInt === U(7 -> true,(6 downto 0) -> false)
val myBool := myUInt === U(myUInt.range -> true)
// For assignement purposes, you can omit the U/S, which also alow the use of the [default -> ???] feature
myUInt := (default -> true) //Assign myUInt with "11111111"
myUInt := (myUInt.range -> true) //Assign myUInt with "11111111"
myUInt := (7 -> true, default -> false) //Assign myUInt with "10000000"
myUInt := ((4 downto 1) -> true, default -> false) //Assign myUInt with "00011110"
Operators
^^^^^^^^^
The following operators are available for the ``UInt`` and ``SInt`` type
Logic
~~~~~
.. list-table::
:header-rows: 1
:widths: 2 4 2
* - Operator
- Description
- Return type
* - x ^ y
- Logical XOR
- Bool
* - ~x
- Bitwise NOT
- T(w(x) bits)
* - x & y
- Bitwise AND
- T(max(w(xy) bits)
* - x | y
- Bitwise OR
- T(max(w(xy) bits)
* - x ^ y
- Bitwise XOR
- T(max(w(xy) bits)
* - x.xorR
- XOR all bits of x
- Bool
* - x.orR
- OR all bits of x
- Bool
* - x.andR
- AND all bits of x
- Bool
* - x \>\> y
- Arithmetic shift right, y : Int
- T(w(x) - y bits)
* - x \>\> y
- Arithmetic shift right, y : UInt
- T(w(x) bits)
* - x \<\< y
- Arithmetic shift left, y : Int
- T(w(x) + y bits)
* - x \<\< y
- Arithmetic shift left, y : UInt
- T(w(x) + max(y) bits)
* - x \|\>\> y
- Logical shift right, y : Int/UInt
- T(w(x) bits)
* - x \|\<\< y
- Logical shift left, y : Int/UInt
- T(w(x) bits)
* - x.rotateLeft(y)
- Logical left rotation, y : UInt/Int
- T(w(x) bits)
* - x.rotateRight(y)
- Logical right rotation, y : UInt/Int
- T(w(x) bits)
* - x.clearAll[()]
- Clear all bits
-
* - x.setAll[()]
- Set all bits
-
* - x.setAllTo(value : Boolean)
- Set all bits to the given Boolean value
-
* - x.setAllTo(value : Bool)
- Set all bits to the given Bool value
-
.. code-block:: scala
// Bitwise operator
val a, b, c = SInt(32 bits)
c := ~(a & b) // Inverse(a AND b)
val all_1 = a.andR // Check that all bit are equal to 1
// Logical shift
val uint_10bits = uint_8bits << 2 // shift left (result on 10 bits)
val shift_8bits = uint_8bits |<< 2 // shift left (result on 8 bits)
// Logical rotation
val myBits = uint_8bits.rotateLeft(3) // left bit rotation
// Set/clear
val a = B"8'x42"
when(cond){
a.setAll() // set all bits to True when cond is True
}
Arithmetic
~~~~~~~~~~
.. list-table::
:header-rows: 1
* - Operator
- Description
- Return
* - x + y
- Addition
- T(max(w(x), w(y) bits)
* - x - y
- Subtraction
- T(max(w(x), w(y) bits)
* - x * y
- Multiplication
- T(w(x) + w(y) bits)
* - x / y
- Division
- T(w(x) bits)
* - x % y
- Modulo
- T(w(x) bits)
.. code-block:: scala
// Addition
val res = mySInt_1 + mySInt_2
Comparison
~~~~~~~~~~
.. list-table::
:header-rows: 1
* - Operator
- Description
- Return type
* - x === y
- Equality
- Bool
* - x =/= y
- Inequality
- Bool
* - x > y
- Greater than
- Bool
* - x >= y
- Greater than or equal
- Bool
* - x < y
- Less than
- Bool
* - x <= y
- Less than or equal
- Bool
.. code-block:: scala
// Comparaison between two SInt
myBool := mySInt_1 > mySInt_2
// Comparaison between UInt and a literal
myBool := myUInt_8bits >= U(3, 8 bits)
when(myUInt_8bits === 3){
}
Type cast
~~~~~~~~~
.. list-table::
:header-rows: 1
* - Operator
- Description
- Return
* - x.asBits
- Binary cast in Bits
- Bits(w(x) bits)
* - x.asUInt
- Binary cast in UInt
- UInt(w(x) bits)
* - x.asSInt
- Binary cast in SInt
- SInt(w(x) bits)
* - x.asBools
- Cast into a array of Bool
- Vec(Bool, w(x))
* - S(x: T)
- Cast a Data into a SInt
- SInt(w(x) bits)
* - U(x: T)
- Cast a Data into an UInt
- UInt(w(x) bits)
To cast a Bool, a Bits or a SInt into a UInt, you can use ``U(something)``. To cast things into a SInt, you can use ``S(something)``
.. code-block:: scala
// cast a SInt to Bits
val myBits = mySInt.asBits
// create a Vector of bool
val myVec = myUInt.asBools
// Cast a Bits to SInt
val mySInt = S(myBits)
Bit extraction
~~~~~~~~~~~~~~
.. list-table::
:header-rows: 1
:widths: 2 6 2
* - Operator
- Description
- Return
* - x(y)
- Readbit, y : Int/UInt
- Bool
* - x(offset, width)
- Read bitfield, offset: UInt, width: Int
- T(width bits)
* - x(\ :ref:`range `\ )
- Read a range of bit. Ex : myBits(4 downto 2)
- T(range bits)
* - x(y) := z
- Assign bits, y : Int/UInt
- Bool
* - x(offset, width) := z
- Assign bitfield, offset: UInt, width: Int
- T(width bits)
* - x(\ :ref:`range `\ ) := z
- Assign a range of bit. Ex : myBits(4 downto 2) := U"010"
- T(range bits)
.. code-block:: scala
// get the element at the index 4
val myBool = myUInt(4)
// assign
mySInt(1) := True
// Range
val myUInt_8bits = myUInt_16bits(7 downto 0)
val myUInt_7bits = myUInt_16bits(0 to 6)
val myUInt_6bits = myUInt_16Bits(0 until 6)
mySInt_8bits(3 downto 0) := mySInt_4bits
Misc
~~~~
.. list-table::
:header-rows: 1
:widths: 2 5 1
* - Operator
- Description
- Return
* - x.getWidth
- Return bitcount
- Int
* - x.msb
- Return the most significant bit
- Bool
* - x.lsb
- Return the least significant bit
- Bool
* - x.range
- Return the range (x.high downto 0)
- Range
* - x.high
- Return the upper bound of the type x
- Int
* - x ## y
- Concatenate, x->high, y->low
- Bits(w(x) + w(y) bits)
* - x @@ y
- Concatenate x:T with y:Bool/SInt/UInt
- T(w(x) + w(y) bits)
* - x.subdivideIn(y slices)
- Subdivide x in y slices, y: Int
- Vec(T, y)
* - x.subdivideIn(y bits)
- Subdivide x in multiple slices of y bits, y: Int
- Vec(T, w(x)/y)
* - x.resize(y)
- | Return a resized copy of x, if enlarged, it is filled with zero
| for UInt or filled with the sign for SInt, y: Int
- T(y bits)
* - x.resized
- | Return a version of x which is allowed to be automatically
| resized were needed
- T(w(x) bits)
* - myUInt.twoComplement(en: Bool)
- Use the two's complement to transform an UInt into an SInt
- SInt(w(myUInt) + 1)
* - mySInt.abs
- Return the absolute value of the SInt value
- SInt(w(mySInt))
* - mySInt.abs(en: Bool)
- Return the absolute value of the SInt value when en is True
- SInt(w(mySInt))
.. code-block:: scala
myBool := mySInt.lsb // equivalent to mySInt(0)
// Concatenation
val mySInt = mySInt_1 @@ mySInt_1 @@ myBool
val myBits = mySInt_1 ## mySInt_1 ## myBool
// Subdivide
val sel = UInt(2 bits)
val mySIntWord = mySInt_128bits.subdivideIn(32 bits)(sel)
// sel = 0 => mySIntWord = mySInt_128bits(127 downto 96)
// sel = 1 => mySIntWord = mySInt_128bits( 95 downto 64)
// sel = 2 => mySIntWord = mySInt_128bits( 63 downto 32)
// sel = 3 => mySIntWord = mySInt_128bits( 31 downto 0)
// if you want to access in a reverse order you can do
val myVector = mySInt_128bits.subdivideIn(32 bits).reverse
val mySIntWord = myVector(sel)
// Resize
myUInt_32bits := U"32'x112233344"
myUInt_8bits := myUInt_32bits.resized // automatic resize (myUInt_8bits = 0x44)
myUInt_8bits := myUInt_32bits.resize(8) // resize to 8 bits (myUInt_8bits = 0x44)
// Two's complement
mySInt := myUInt.twoComplement(myBool)
// Absolute value
mySInt_abs := mySInt.abs